#ifndef __ACUMULADOR_H
#define __ACUMULADOR_H

#include "matriz.h"
#include "color.h"
#include "imagen.h"
/**
@brief Guarda el estado del acumulador
*/
class Acumulador{
	private:
		/**
		@brief Matriz que guardara todas las posiciones del acumulador
		*/		
		Matriz m;	
		/**
		@brief Posicion X donde comienza a pintarse el acumulador
		*/		
		int posx;
		/**
		@brief Posicion Y donde comienza a pintarse el acumulador
		*/		
		int posy;
		/**
		@brief Ancho del acumulador
		*/
		int ancho;
		/**
		@brief Alto del acumulador
		*/
		int alto;
		/**
		@brief Tamaño del marco del acumulador
		*/
		int marco;
		/**
		@brief Numero de filas del acumulador
		*/
		int filas;
		/**
		@brief Numero de columnas del acumulador
		*/
		int columnas;
		/**
		@brief Color del fondo
		*/
		Color fondo;
		/**
		@brief Color del borde
		*/
		Color borde;
	public:
		/**
     		@brief Constructor por defecto
  		 */
		Acumulador();
		/**
    	 	@brief Constructor por valor
    	 	@param posx Posicion X donde comenzara a pintarse el acumulador
   		@param posy Posicion Y donde comenzara a pintarse el acumulador
   		@param ancho Ancho del acumulador
   		@param alto Alto del acumulador
   		@param marco Tamaño del marco
   		@param filas Numero de filas del acumulador
   		@param columnas Numero de columnas del acumulador
   		@param borde Color del borde
   		@param fondo Color del fondo
   		@pre posx mayor o igual que 0
   		@pre posy mayor o igual que 0
   		@pre ancho mayor que 0
   		@pre alto mayor que 0
   		@pre marco mayor o igual que 0
   		@pre filas mayor que 0
   		@pre columnas mayor que 0
   		*/
		Acumulador(int posx,int posy,int ancho, int alto,int marco,int filas,int columnas,const Color& borde,const Color& fondo);
		/**
     		@brief Devuelve el número de filas
    		@return Número total de filas
   		*/
		int Filas() const;     
		/**
     		@brief Devuelve el número de columnas
    		@return Número total de columnas
   		*/
		int Columnas() const;  
		/**
     		@brief Devuelve el ancho del acumulador en pixeles
    		@return Ancho del acumulador
   		*/
		int Ancho() const;
		/**
     		@brief Devuelve el alto del acumulador en pixeles
    		@return Alto del acumulador
   		*/
		int Alto() const;
		/**
     		@brief Devuelve el tamaño del marco del acumulador en pixeles
    		@return Tamaño del marco
   		*/
		int Marco() const;
		/**
     		@brief Devuelve la posicion X en pixeles donde comienza a dibujarse el acumulador 
    		@return Posición X del acumulador
   		*/
		int PosX() const;
		/**
     		@brief Devuelve la posicion Y en pixeles donde comienza a dibujarse el acumulador 
    		@return Posición Y del acumulador
   		*/
		int PosY() const;
		/**
    		@brief Modifica una posición del acumulador
     		@param i Fila del acumulador que se desea modificar
		@param j Columna del acumulador que se desea modificar
     		@param v Valor que se inserta en la posición indicada
     		@pre i mayor o igual que 0 y menor que filas
     		@pre j mayor o igual que 0 y menor que columnas
		*/
		void Set(int i, int j, int v);   
		/**
    		@brief Devuelve una posición del acumulador
     		@param i Fila del acumulador que se desea devolver
		@param j Columna del acumulador que se desea devolver
     		@pre i mayor o igual que 0 y menor que filas
     		@pre j mayor o igual que 0 y menor que columnas
   		*/ 
		int Get(int i, int j) const;      
		/**
     		@brief Devuelve las lineas que hay completas en el acumulador
    		@return Número de lineas completas
   		*/
		int HayLineas();
		/**
     		@brief Devuelve true si el acumulador está lleno y false si no y borra las lineas completas
    		@return Booleano qu indica si el acumulador está lleno (true) o vacio (false)
   		*/
		bool Pierdes() const;
		/**
    		@brief Pinta el contenido del acumulador en pantalla
		@param im Vector de imagenes donde se guardan todas las imagenes necesarias para formar las piezas
     		@param num_imagenes Número de imagenes que hay en el vector de imagenes
     		@pre im tiene que contener imagenes válidas
     		@pre num_imagenes tiene que ser mayor que 0
   		*/ 
		void Pinta(Imagen im[],int num_imagenes) const;
		/**
     		@brief Operador de asignación
   		*/
		Acumulador& operator=(const Acumulador& acu); 
		/**
     		@brief Destructor
   		*/
		~Acumulador ();


};
#endif
